package com.kty.cesuan.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kty.cesuan.mapper.MhysMapper;
import com.kty.cesuan.pojo.Mhys;
import com.kty.cesuan.service.MhysService;
import com.kty.methods.mhys.method.choice.GregorianDate;
import com.kty.methods.mhys.method.choice.NowDate;
import com.kty.methods.mhys.method.choice.lunarDate;
import com.kty.methods.mhys.method.entrance.MeiHuaYiShu;
import com.kty.methods.mhys.method.mhys.MeiHua;
import com.kty.methods.utils.Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MhysServiceImpl extends ServiceImpl<MhysMapper, Mhys> implements MhysService {

    @Autowired
    private MhysService mhysService;

    private static final MeiHuaYiShu meiHuaYiShu = new MeiHuaYiShu();

//**********************************************************************************************************************

    /**
     * 按照当前公历日期测算
     */
    public boolean now() {

        // 按照【当前日期测算】
        MeiHua meiHua = new NowDate().getMeiHua();

        // 信息封装
        meiHuaYiShu.run(meiHua);

        // 信息保存至数据库
        return calculation(meiHua);

    }

    /**
     * 按照指定日期测算
     *
     * @param year   年
     * @param month  月
     * @param day    日
     * @param time   时
     * @param minute 分
     * @param second 秒
     * @param choice 0：公历日期     1：农历日期
     */
    public boolean choice(int year, int month, int day, int time, int minute, int second, int choice) {

        // 初始化
        MeiHua meiHua;
        // 判断
        if (choice == 1) {
            // 通过农历日期测算
            meiHua = new lunarDate(year, month, day, time, minute, second).getMeiHua();
        } else {
            // 通过公历日期测算
            meiHua = new GregorianDate(Utils.stringToDate(year, month, day, time, minute, second)).getMeiHua();
        }

        // 信息封装
        meiHuaYiShu.run(meiHua);

        // 信息保存至数据库
        return calculation(meiHua);

    }

//======================================================================================================================

    /**
     * 测算并保存信息
     */
    private boolean calculation(MeiHua meiHua) {

        // 1、数据判断
        // 条件构造（封装构造条件）
        LambdaQueryWrapper<Mhys> qw = new LambdaQueryWrapper<>();
        qw.in(Mhys::getLunarDate, meiHua.getLunarDateStr());
        int count = this.count(qw);
        // 若count>0，则不可再次测算
        if (count > 0) {
            return false;
        }

        // 2、设置数据
        Mhys mhys = meiHuaYiShu.getMhys(meiHua);

        // 3、添加数据
        mhysService.save(mhys);
        return true;

    }

}
